package cc.comac.mom.datahandlers.entity;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import cc.comac.mom.bean.EquipParamItem;
import cc.comac.mom.dao.entity.EquipParamItemDao;
import cc.comac.mom.entity.EquipParamItemEntity;
import cc.comac.mom.util.BaseEntityDataUtil;
import cc.comac.mom.util.GetGeneralFieldValue;

@Component
@Transactional
public class EquipParamItemDataHandler extends ServiceImpl<EquipParamItemDao, EquipParamItemEntity> {
	@Autowired
	private EquipParamItemDao equipParamItemDao;
	@Autowired
	private BaseEntityDataUtil baseEntityDataUtil;
	/**
	 * 新增参数项
	 * 
	 * @param equipParamItem
	 * @return 受影响行数
	 */
	public int insert(EquipParamItem equipParamItem) {
		// 校验参数项编码是否重复
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("row_status", 1);
		map.put("param_name", equipParamItem.getParamName());
		map.put("param_item_name", equipParamItem.getParamItemName());
		List<EquipParamItemEntity> selectByParamNameAndParamItemName = equipParamItemDao.selectByMap(map);
		if (selectByParamNameAndParamItemName!=null && selectByParamNameAndParamItemName.size() > 0) {
			throw new RuntimeException("参数项编码:" + equipParamItem.getParamItemName() + "已存在！");
		}
		// 校验参数项编码是否重复
		map.put("param_item_value", equipParamItem.getParamItemValue());
		List<EquipParamItemEntity> selectByParamNameAndParamItemNameAndParamItemValue = equipParamItemDao
				.selectByMap(map);
		if (selectByParamNameAndParamItemNameAndParamItemValue!=null && selectByParamNameAndParamItemNameAndParamItemValue.size() > 0) {
			throw new RuntimeException("参数项名称:" + equipParamItem.getParamItemValue() + "已存在！");
		}
		// 判断参数为默认值是，同参数组下是否已存在默认值
		if (equipParamItem.getIsDefault() == 1) {
			map.clear();
			map.put("param_name", equipParamItem.getParamName());
			map.put("is_default", 1);
			map.put("row_status", 1);
			List<EquipParamItemEntity> selectByParamIdAndDefault = equipParamItemDao.selectByMap(map);
			if (selectByParamIdAndDefault!=null && selectByParamIdAndDefault.size() > 0) {
				throw new RuntimeException("相同参数组已存在默认值，此数据不允许更改为默认值！");
			}
		}
		// 保存数据
		baseEntityDataUtil.setBaseEntityData(equipParamItem);
		Integer insert = equipParamItemDao.insert((EquipParamItemEntity) equipParamItem);
		return insert;
	}

	/**
	 * 修改参数项
	 * 
	 * @param equipParamItem
	 * @return 受影响行数
	 */
	public int update(EquipParamItem equipParamItem) {
		// 校验参数项编码是否重复
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("row_status", 1);
		map.put("param_name", equipParamItem.getParamName());
		map.put("param_item_name", equipParamItem.getParamItemName());
		List<EquipParamItemEntity> selectByParamIdAndParamItemName = equipParamItemDao.selectByMap(map);
		if (selectByParamIdAndParamItemName!=null && selectByParamIdAndParamItemName.size() > 0
				&& equipParamItem.getId() != selectByParamIdAndParamItemName.get(0).getId()) {
			throw new RuntimeException("参数项编码:" + equipParamItem.getParamItemName() + "已存在！");
		}
		// 校验参数项编码是否重复
		map.put("param_item_value", equipParamItem.getParamItemValue());
		List<EquipParamItemEntity> selectByParamIdAndParamItemNameAndParamItemValue = equipParamItemDao
				.selectByMap(map);
		if (selectByParamIdAndParamItemNameAndParamItemValue!=null && selectByParamIdAndParamItemNameAndParamItemValue.size() > 0 && equipParamItem
				.getId() != selectByParamIdAndParamItemNameAndParamItemValue.get(0).getId()) {
			throw new RuntimeException("参数项名称:" + equipParamItem.getParamItemValue() + "已存在！");
		}
		// 判断参数为默认值是，同参数组下是否已存在默认值
		if (equipParamItem.getIsDefault() == 1) {
			map.clear();
			map.put("param_name", equipParamItem.getParamName());
			map.put("is_default", 1);
			map.put("row_status", 1);
			List<EquipParamItemEntity> selectByParamIdAndDefault = equipParamItemDao.selectByMap(map);
			if (selectByParamIdAndDefault!=null && selectByParamIdAndDefault.size() > 0 && equipParamItem.getId()!=selectByParamIdAndDefault.get(0).getId()) {
				throw new RuntimeException("相同参数组已存在默认值，此数据不允许更改为默认值！");
			}
		}
		// 更新数据
		equipParamItem.setLastModifiedTime(LocalDateTime.now());
		equipParamItem.setLastModifier(GetGeneralFieldValue.getCurrentUser());
		Integer updateById = equipParamItemDao.updateById(((EquipParamItemEntity) equipParamItem));
		return updateById;
	}

	/**
	 * 批量删除
	 * 
	 * @param equipParamItemList
	 * @return
	 */
	public int batchDelete(List<EquipParamItem> equipParamItemList) {
		
		ArrayList<Long> listIds = new ArrayList<Long>();
		// 预留删除校验
		for (EquipParamItem equipParamItem : equipParamItemList) {
			listIds.add(equipParamItem.getId());
		}
		List<EquipParamItemEntity> selectBatchIds = equipParamItemDao.selectBatchIds(listIds);
		if(selectBatchIds == null || selectBatchIds.size()<1) {
			return 0;
		}
		for(EquipParamItemEntity item :selectBatchIds) {
			baseEntityDataUtil.deleteBaseEntityData(item);
		}
		// 批量更新数据
		boolean updateBatchById = updateBatchById(selectBatchIds);
		return updateBatchById ? 1 : 0;
	}

	/**
	 * 分页查询
	 * 
	 * @param equipParamItem
	 * @return
	 */
	public EquipParamItem selectAllByPage(EquipParamItem equipParamItem) {
		EquipParamItem returnEquipParamItem = new EquipParamItem();
		if(equipParamItem.getPageNum()==null || equipParamItem.getPageNum()==0) {
			equipParamItem.setPageNum(1);
		}
		if(equipParamItem.getPageSize()==null || equipParamItem.getPageSize()==0) {
			equipParamItem.setPageSize(10);
		}
		
		QueryWrapper<EquipParamItemEntity> queryWrapper = new QueryWrapper<EquipParamItemEntity>();
		queryWrapper.eq("row_status", 1);
		if(equipParamItem.getParamName()!=null && !"".equals(equipParamItem.getParamName())) {
			queryWrapper.eq("param_name", equipParamItem.getParamName());
		}
		// 不返回总记录数 设置false
		Page<EquipParamItemEntity> page = new Page<>(equipParamItem.getPageNum(), equipParamItem.getPageSize(), true);
		IPage<EquipParamItemEntity> iPage = equipParamItemDao.selectPage(page, queryWrapper);
		System.out.println("总页数:" + iPage.getPages());
		System.out.println("总记录数:" + iPage.getTotal());
		List<EquipParamItemEntity> records = iPage.getRecords();
		returnEquipParamItem.setPageNum(equipParamItem.getPageNum());
		returnEquipParamItem.setPageSize(equipParamItem.getPageSize());
		returnEquipParamItem.setEntityList(records);
		returnEquipParamItem.setTotalQuantity((int) iPage.getTotal());
		returnEquipParamItem.setPageCount((int) iPage.getPages());
		return returnEquipParamItem;
	}

	/**
	 * 根据参数组name查询,参数项删除校验
	 * 
	 * @param paramName 参数组name
	 * @return
	 */
	public List<EquipParamItemEntity> selectAllByParamName(String paramName) {
		EquipParamItem equipParamItem = new EquipParamItem();
		equipParamItem.setParamName(paramName);
		QueryWrapper<EquipParamItemEntity> queryWrapper = new QueryWrapper<EquipParamItemEntity>();
		queryWrapper.eq("row_status", 1);
		queryWrapper.eq("param_name", equipParamItem.getParamName());
		List<EquipParamItemEntity> paramItemList = equipParamItemDao.selectList(queryWrapper);
		return paramItemList;
	}
	
	/**
	 * 根据参数组name查询,供下拉框查询
	 * @param equipParamItem
	 * @return
	 */
	public EquipParamItem returnSelectAllByParamName(EquipParamItem equipParamItem) {
		EquipParamItem returnEquipParamItem = new EquipParamItem();
		QueryWrapper<EquipParamItemEntity> queryWrapper = new QueryWrapper<EquipParamItemEntity>();
		queryWrapper.eq("row_status", 1);
		queryWrapper.eq("param_name", equipParamItem.getParamName());
		List<EquipParamItemEntity> paramItemList = equipParamItemDao.selectList(queryWrapper);
		returnEquipParamItem.setEntityList(paramItemList);
		return returnEquipParamItem;
	}
	
	/**
	 * 根据参数组name和参数项name查询，数据字典翻译
	 * @param equipParamItem
	 * @return
	 */
	public EquipParamItem  returnSelectAllByParamNameandParamItemName(EquipParamItem equipParamItem) {
		EquipParamItem returnEquipParamItem = new EquipParamItem();
		QueryWrapper<EquipParamItemEntity> queryWrapper = new QueryWrapper<EquipParamItemEntity>();
		queryWrapper.eq("row_status", 1);
		queryWrapper.eq("param_name", equipParamItem.getParamName());
		queryWrapper.eq("param_item_name", equipParamItem.getParamItemName());
		List<EquipParamItemEntity> paramItemList = equipParamItemDao.selectList(queryWrapper);
		returnEquipParamItem.setEntityList(paramItemList);
		return returnEquipParamItem;
	}
	/**
	 * 批量更新
	 * 
	 * @param entityList
	 * @return
	 */
	@Override
	public boolean updateBatchById(Collection<EquipParamItemEntity> entityList) {
		return super.updateBatchById(entityList);
	}
}
